﻿        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        using Rizmar.RizmarDataSetTableAdapters;
        using Microsoft.Reporting.WinForms;

namespace Rizmar
{
    public partial class LancamentoForm : Form
    {
        internal int n_titulos;
        internal List<Titulo> titulos;
        RelatorioForm parent;
        public enum StatusLancamento
        {
            inserindo,
            salvo,
            modificando
        }

        private StatusLancamento status;

        public LancamentoForm()
        {
            titulos = new List<Titulo>();
            n_titulos = 0;
            status = StatusLancamento.inserindo;
            InitializeComponent();
        }

        public LancamentoForm(RelatorioForm form)
        {
            parent = form;
            InitializeComponent();
        }

        public void setStatusModificando() 
        {
            status = StatusLancamento.modificando;
        }

        public void setStatus(StatusLancamento s)
        {
            status = s;
        }

        public StatusLancamento getStatus()
        {
            return status;
        }

        private void novoTitulo_Click(object sender, EventArgs e)
        {
            if (status == StatusLancamento.inserindo)
            {
                if (titulos[n_titulos - 1].Completo() && textBoxCliente.Text != string.Empty)
                {
                        if (verificaCodigo())
                        {
                            titulos[n_titulos - 1].setDiasLabelText();
                            titulos[n_titulos - 1].setLiquidoLabelText();
                            titulos[n_titulos - 1].setDesagioLabelText();

                            setDesagioTotalLabel();
                            setLiquidoTotalLabel();
                            setBrutoTotalLabel();
                            setPisTotalLabel();
                            setCofinsTotalLabel();
                            setIofTotalLabel();
                            setIssTotalLabel();
                            setCpmfTotalLabel();

                      
                            Titulo novo = new Titulo(this);

                            //verificaLimiteTitulos();

                            novo.Location = (new System.Drawing.Point(0, titulos[n_titulos - 1].Location.Y + 117));
                            novo.idLabel.Text = (n_titulos + 1).ToString();

                            panelPrincipal.Controls.Add(novo);
                            titulos.Add(novo);
                            n_titulos++;

                            buttonPesquisaCliente.Enabled = false;
                            servicoRadioButton.Enabled = false;
                            factoringRadioButton.Enabled = false;
                            int qntTab = 0;
                            qntTab = 7 + 13 * (n_titulos - 1);
                            for (int i = 0; i < qntTab; i++)
                            {
                                System.Windows.Forms.SendKeys.Send("{TAB}");
                            }
                        }
                }
                else
                    MessageBox.Show("Existem campos em branco");
            }
            else
            {
                limpaForm();
                status = StatusLancamento.inserindo;
            }
        }

        internal bool verificaCodigo()
        {
            for (int i = 0; i < n_titulos - 1; i++)
            {
                if (titulos[n_titulos-1].codigoTextBox.Text == titulos[i].codigoTextBox.Text)
                {
                    MessageBox.Show("Já existe um título com esse código.");
                    titulos[n_titulos-1].codigoTextBox.Focus();
                    titulos[n_titulos-1].codigoTextBox.SelectAll();
                    return false;
                }
            }

            RizmarDataSet.TituloDataTable tdt = new RizmarDataSet.TituloDataTable();
            TituloTableAdapter tta = new TituloTableAdapter();
            tdt = tta.PesquisaPorCodigo(titulos[n_titulos-1].codigoTextBox.Text);
            if (tdt.Rows.Count > 0)
            {
                MessageBox.Show("Já existe um título com esse código.");
                titulos[n_titulos-1].codigoTextBox.Focus();
                titulos[n_titulos-1].codigoTextBox.SelectAll();
                return false;
            }
            return true;

        }

        private void limpaForm()
        {
            buttonPesquisaCliente.Enabled = true;
            servicoRadioButton.Enabled = true;
            factoringRadioButton.Enabled = true;

            textBoxCliente.Clear();
            textBoxCódigo.Clear();

            for (int i = n_titulos-1; i >= 0; i--)
            {
                panelPrincipal.Controls.Remove(panelPrincipal.Controls[i]);
                titulos.RemoveAt(i);
            }

            n_titulos = 0;
            setDesagioTotalLabel();
            setLiquidoTotalLabel();
            setBrutoTotalLabel();

            Titulo novo = new Titulo(this);
            novo.Location = (new System.Drawing.Point(0, 0));
            titulos.Add(novo);
            panelPrincipal.Controls.Add(novo);
            n_titulos++;
        }

        private void excluirButton_Click(object sender, EventArgs e)
        {
            if (status == StatusLancamento.inserindo)
            {
                if (n_titulos > 1)
                {
                    if (n_titulos == 2)
                    {
                        buttonPesquisaCliente.Enabled = true;
                        servicoRadioButton.Enabled = true;
                        factoringRadioButton.Enabled = true;
                    }

                    panelPrincipal.Controls.Remove(panelPrincipal.Controls[n_titulos - 1]);
                    titulos.RemoveAt(n_titulos-1);
                    n_titulos--;

                    setDesagioTotalLabel();
                    setLiquidoTotalLabel();
                    setBrutoTotalLabel();
                }
            }
        }

        private void buttonPesquisaCliente_Click(object sender, EventArgs e)
        {
            PesquisaClienteForm form = new PesquisaClienteForm(this);
            form.ShowDialog();
        }

        internal void salvar() 
        {

            int d;
            int cliente_id, sacado_id, dias;
            int? bordero_id;
            decimal valor, desagio, liquido, taxa_adm, bruto, iss, pis, cofins, cpmf, iof, duplicata, desconto;
            bool tipo, tipo_serviço, sucesso = false;
            DateTime data_base, vencimento;
            String codigo, banco;

            if (status == StatusLancamento.inserindo)
            {
                if (titulos[n_titulos - 1].Completo() && textBoxCliente.Text != string.Empty)
                {
                    if (verificaCodigo())
                    {
                        EscolhaDescontos form = new EscolhaDescontos(this);
                        form.ShowDialog();
                        if (form.DialogResult == DialogResult.OK)
                        {

                            titulos[n_titulos - 1].setDiasLabelText();
                            titulos[n_titulos - 1].setLiquidoLabelText();
                            titulos[n_titulos - 1].setDesagioLabelText();

                            setDesagioTotalLabel();
                            setLiquidoTotalLabel();
                            setBrutoTotalLabel();

                            setBorderoFields(out cliente_id, out desagio, out taxa_adm, out liquido, out bruto, out duplicata, out desconto, out iss, out cpmf, out pis, out cofins, out iof, form);
                            BorderoTableAdapter ta = new BorderoTableAdapter();

                            if (ta.InsertQuery(cliente_id, desagio, taxa_adm, liquido, bruto, duplicata, desconto, iss, iof, cpmf, pis, cofins) <= 0) MessageBox.Show("FU");
                            bordero_id = ta.SelectMaxId();
                            DescontoTableAdapter dta = new DescontoTableAdapter();
                            dta.UpdateDesconto(Convert.ToInt32(bordero_id), Convert.ToInt32(textBoxCódigo.Text));

                            RizmarDataSet.BorderoDataTable bdt = new RizmarDataSet.BorderoDataTable();
                            
                            

                            
                            foreach (Titulo t in panelPrincipal.Controls)
                            {
                                TituloTableAdapter tta = new TituloTableAdapter();
                                setTituloFields(out cliente_id, out sacado_id, out codigo, out valor, out tipo, out banco, out data_base, out vencimento, out dias, out d, out desagio, out liquido, out tipo_serviço, out taxa_adm, t);
                                sucesso = false;
                                if (tta.InsertQuery(cliente_id, sacado_id, Convert.ToInt32(bordero_id), codigo, valor, tipo, banco, data_base.ToString(), vencimento.ToString(), dias, d, desagio, liquido, tipo_serviço, true, true, taxa_adm) > 0)
                                {
                                    t.Enabled = false;
                                    sucesso = true;
                                }
                            }
                            if (sucesso)
                            {
                                MessageBox.Show("Os títulos foram lançados.");
                                status = StatusLancamento.salvo;
                                //ta.PreenchePorID(bdt,Convert.ToInt32(bordero_id));                               
                            }
                        }
                    }
                    else
                        MessageBox.Show("Existem campos em branco.");
                }
                else
                    MessageBox.Show("Os dados já foram salvos. Clique em novo para um novo lançamento.");
            }else
                if (status == StatusLancamento.modificando) 
                {
                    BorderoTableAdapter ta = new BorderoTableAdapter();                    
                    bordero_id = ta.SelectMaxId();
                    TituloTableAdapter tta = new TituloTableAdapter();
                    tta.DeleteTitulo(Convert.ToInt32(bordero_id));
                    ta.DeleteBordero(Convert.ToInt32(bordero_id));
                    foreach (Titulo t in panelPrincipal.Controls)
                    {    
                            t.Enabled = true;               
                    }
                    status = StatusLancamento.inserindo;
                }
        }


        private void salvarButton_Click(object sender, EventArgs e)
        {
            salvar();
            visualizarBordero();
        }

        private void setBorderoFields(out int cliente_id, out decimal desagio, out decimal taxa_adm, out decimal liquido, 
            out decimal bruto, out decimal duplicata, out decimal desconto, out decimal iss, out decimal cpmf, 
            out decimal pis, out decimal cofins, out decimal iof, EscolhaDescontos ed)
        {
            cliente_id = Convert.ToInt32(textBoxCódigo.Text);
            desagio = Convert.ToDecimal(desagioTotalLabel.Text);
            taxa_adm = getTotalAdm();
            liquido = Convert.ToDecimal(liquidoTotallabel.Text);
            bruto = Convert.ToDecimal(brutoTotalLabel.Text);
            duplicata = getTotalDuplicata();
            iss = Convert.ToDecimal(issTotalLabel.Text);
            cpmf = Convert.ToDecimal(cpmfTotalLabel.Text);
            pis = Convert.ToDecimal(pisTotalLabel.Text);
            cofins = Convert.ToDecimal(cofinsTotalLabel.Text);
            desconto = ed.getTotalDesconto();
            iof = Convert.ToDecimal(iofTotalLabel.Text);
        }

        private decimal getTotalDuplicata() 
        {
            decimal soma = 0;
            foreach (Titulo t in titulos)
                if (t.duplicataRadioButton.Checked == true)
                soma += t.getDuplicata();
            return soma;
        }

        private decimal getTotalAdm()
        {
            decimal soma = 0;
            foreach (Titulo t in titulos)
                soma += t.gettaxaAdm();
            return soma;
        }

        private void setTituloFields(out int cliente_id, out int sacado_id, out string codigo, out decimal valor, out bool tipo, out string banco, out DateTime data_base, out DateTime vencimento, out int dias, out int d, out decimal desagio, out decimal liquido, out bool tipo_serviço, out decimal taxa_adm, Titulo t)
        {
            cliente_id = Convert.ToInt32(textBoxCódigo.Text);
            sacado_id = Convert.ToInt32(t.codigoSacadoLabel.Text);
            codigo = t.codigoTextBox.Text;
            valor = Convert.ToDecimal(t.valorTextBox.Text.Replace(".",","));
            tipo = (t.chequeRadioButton.Checked);
            banco = t.bancoTextBox.Text;
            data_base = Convert.ToDateTime(t.dataBaseDateTimePicker.Text);
            vencimento = Convert.ToDateTime(t.vencimentoDateTimePicker.Text);
            dias = Convert.ToInt32(t.diasValorLabel.Text);
            taxa_adm = t.gettaxaAdm();
            
            if (t.dTextBox.Text != string.Empty)
                d = Convert.ToInt32(t.dTextBox.Text);
            else
                d = 0;
            desagio = Convert.ToDecimal(t.desagioValorLabel.Text);
            liquido = Convert.ToDecimal(t.liquidoValorLabel.Text);
            tipo_serviço = (servicoRadioButton.Checked);
        }
       
        private void LancamentoForm_Load(object sender, EventArgs e)
        {
         
            Titulo novo = new Titulo(this);

            /*Configuração de alguns atributos do novo título*/
            novo.Location = (new System.Drawing.Point(0, 0));

            /*Adiciona novo título ao vetor de títulos*/
            titulos.Add(novo);
            n_titulos++;

            /*Adiciona novo título ao painel principal*/
            panelPrincipal.Controls.Add(novo);

            buttonPesquisaCliente.Focus();

        }

        public void verificaLimiteTitulos()
        {
            TituloTableAdapter tta = new TituloTableAdapter();
            RizmarDataSet.TituloDataTable tdt = new RizmarDataSet.TituloDataTable();
            tdt = tta.PesquisaPorClienteID(Convert.ToInt32(textBoxCódigo.Text));
            decimal? soma = 0;
            decimal? somaBd = 0;
            decimal? somaBordero = 0;
            decimal valorMax = 0;

            ClienteTableAdapter cta = new ClienteTableAdapter();
            RizmarDataSet.ClienteDataTable cdt = new RizmarDataSet.ClienteDataTable();
            cdt = cta.PesquisaPorID(Convert.ToInt32(textBoxCódigo.Text));

            if (cdt.Rows.Count > 0)
                {
                    valorMax = Convert.ToDecimal(cdt.Rows[0]["limite"]);
                    
                }

                if (tdt.Rows.Count > 0)
                {
                    somaBd = (decimal) tta.RetornaSomaValor(Convert.ToInt32(textBoxCódigo.Text));
                }
                
                for (int i = 0; i < n_titulos; i++) 
                {
                    somaBordero += Convert.ToDecimal(titulos[i].valorTextBox.Text);
                }
                
                soma = somaBd + somaBordero;    

            if (soma > valorMax)
             MessageBox.Show("Valor máximo ultrapassado!!!"); 
        
        }

        private void sairButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void visualizarBordero() 
        {
            if (status == StatusLancamento.salvo)
            {
                RelatorioForm form = new RelatorioForm(this);
                form.ShowDialog();
            }
        }

        private void visualizarButton_Click(object sender, EventArgs e)
        {
            if (status == StatusLancamento.salvo)
            {
                RelatorioForm form = new RelatorioForm(this);
                form.ShowDialog();
            }
        }

        public void setDesagioTotalLabel()
        {
            decimal somaDesagio = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaDesagio += Convert.ToDecimal(titulos[i].desagioValorLabel.Text.Replace('.', ','));
            }
            desagioTotalLabel.Text = Convert.ToString(decimal.Round(somaDesagio, 2));
        }

        public void setLiquidoTotalLabel()
        {
            decimal somaLiquido = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaLiquido += Convert.ToDecimal(titulos[i].liquidoValorLabel.Text.Replace('.', ','));
            }
            liquidoTotallabel.Text = Convert.ToString(decimal.Round(somaLiquido, 2));
        }

        public void setBrutoTotalLabel()
        {
            decimal somaBruto = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaBruto += Convert.ToDecimal(titulos[i].valorTextBox.Text.Replace('.',','));
            }
            brutoTotalLabel.Text = Convert.ToString(decimal.Round(somaBruto,2));
        }

        public void setPisTotalLabel()
        {
            decimal somaPis = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaPis += titulos[i].getPis();
            }
            pisTotalLabel.Text = Convert.ToString(decimal.Round(somaPis, 2));
        }

        public void setCofinsTotalLabel()
        {
            decimal somaCofins = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaCofins += titulos[i].getCofins();
            }
            cofinsTotalLabel.Text = Convert.ToString(decimal.Round(somaCofins, 2));
        }

        public void setIofTotalLabel()
        {
            decimal somaIof = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaIof += titulos[i].getIof();
            }
            iofTotalLabel.Text = Convert.ToString(decimal.Round(somaIof, 2));
        }

        public void setIssTotalLabel()
        {
            decimal somaIss = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaIss += titulos[i].getIss();
            }
            issTotalLabel.Text = Convert.ToString(decimal.Round(somaIss, 2));
        }

        public void setCpmfTotalLabel()
        {
            decimal somaCpmf = 0;
            for (int i = 0; i < n_titulos; i++)
            {
                somaCpmf += titulos[i].getCpmf();
            }
            cpmfTotalLabel.Text = Convert.ToString(decimal.Round(somaCpmf, 2));
        }

        private void servicoRadioButton_CheckedChanged(object sender, EventArgs e)
        {
            if (servicoRadioButton.Checked)
            {
                pisTotal.Visible = false;
                pisTotalLabel.Visible = false;
                iofTotal.Visible = false;
                iofTotalLabel.Visible = false;
                issTotal.Visible = false;
                issTotalLabel.Visible = false;
                cofinsTotalLabel.Visible = false;
                confinsTotal.Visible = false;
                cpmfTotal.Visible = false;
                cpmfTotalLabel.Visible = false;
               
            }
            else
            {
                pisTotal.Visible = true;
                pisTotalLabel.Visible = true;
                iofTotal.Visible = true;
                iofTotalLabel.Visible = true;
                issTotal.Visible = true;
                issTotalLabel.Visible = true;
                cofinsTotalLabel.Visible = true;
                confinsTotal.Visible = true;
                cpmfTotal.Visible = true;
                cpmfTotalLabel.Visible = true;
            }
        }

        private void recalcular_Click(object sender, EventArgs e)
        {
            if (titulos[n_titulos - 1].Completo())
            {
                for (int i = 0; i < n_titulos; i++)
                    if (titulos[i].Completo() && textBoxCliente.Text != string.Empty)
                    {
                        titulos[i].setDiasLabelText();
                        titulos[i].setLiquidoLabelText();
                        titulos[i].setDesagioLabelText();

                        setDesagioTotalLabel();
                        setLiquidoTotalLabel();
                        setBrutoTotalLabel();
                        setPisTotalLabel();
                        setCofinsTotalLabel();
                        setIofTotalLabel();
                        setIssTotalLabel();
                        setCpmfTotalLabel();

                    }
                verificaLimiteTitulos();
            }
            else
            {
                MessageBox.Show("Existem campos em branco");
            }
        }


        private void servicoRadioButton_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                e.Handled = true;
                System.Windows.Forms.SendKeys.Send("{TAB}");
            }
        }

        private void factoringRadioButton_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                e.Handled = true;
                System.Windows.Forms.SendKeys.Send("{TAB}");
            }
        }


       
    }
}
        
        
